package com.xiangmo.travel.Service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xiangmo.travel.Dto.*;
import com.xiangmo.travel.Dvo.TableCollectDvo;
import com.xiangmo.travel.Dvo.TeamInfoDvo;
import com.xiangmo.travel.Dvo.TeamTapCountDvo;
import com.xiangmo.travel.Dvo.TeamUserDvo;
import com.xiangmo.travel.Entity.Team;
import com.xiangmo.travel.Entity.TeamRequest;
import com.xiangmo.travel.Entity.User;

import java.util.List;

public interface TeamService {
    //team部分--------------------
    //创建、发起组队
    int addTeam(TeamDto teamDto);

    //解散、取消组队
    int deleteTeam(Long id);

    //根据景点id查询组队的信息，组队完成的不展示
    Page<Team> queryTeam(int pageNum, int pageSize, Long id);

    //手动改成完成组队状态
    int changeTeamStatus(Long id);

    //根据用户id查询个人创建的队伍
    PageInfoDto<TeamInfoDvo<List<User>>> getMyTeamByUserId(Long userId, int pageNum, int pageSize);

    //根据队伍id查询队长信息
    User getTeamUserByTeamId(Long teamId);

    //根据队伍id查询队伍信息
    Team getTeamByTeamId(Long teamId);

    //team_user部分---------------
    //添加队伍成员
    int addTeamUser(TeamUserDto teamUserDto);

    //删除队伍成员 队长踢人和队友主动退出
    int deleteTeamUser(Long userId, Long teamId);

    //查询已加入的队员,这里只能查到用户id，还需要进一步通过用户id进行用户信息查询
    List<TeamUserDvo> queryTeamUser(Long teamId);

    //校验用户是否有权限：为队长或为删除自己的数据
    int checkTeamUserRoot(TeamUserDto teamUserDto, Long userId);

    //根据用户id查询个人创建的队伍
    PageInfoDto<TeamInfoDvo<List<User>>> getOtherTeamByUserId(Long userId, int pageNum, int pageSize);

    //team_request部分------------
    //新建请求 队员申请加入
    int addTeamRequest(TeamRequestDto teamRequestDto);

    //查询
    Page<TeamRequest> queryTeamRequest(int pageNum, int pageSize, Long teamId);

    //队员取消请求 删除请求
    int deleteTeamRequest(Long id);

    //校验用户是否有权限：删除自己的数据
    int checkTeamRequestRoot(TeamRequestDto teamRequestDto, Long userId);

    //other------------------------
    //校验team（用户id和景点id）是否已经存在了
    int checkTeamByUserIdAndAttractionsId(Long userId, Long attractionsId);
    int checkTeamUserByUserIdAndTeamId(Long userId, Long teamId);
    int checkTeamRequestByUserIdAndTeamId(Long userId, Long teamId);

    //用户组队次数排行榜
    // 定义一个方法，用于查询前十三名用户的组队次数排名
    List<TeamTapCountDvo> getTopTenRanking();

    //查询该景点近6天的一个被组队次数
    List<TableCollectDvo> getTop6TeamById(Long id);

    //根据用户id查询该用户的组队次数
    Long getTeamCountByUserId(Long userId);
}
